package com.augurit.common.dao;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.augurit.common.base.dao.BaseDao;
import com.augurit.common.entity.AcFunction;
import com.augurit.common.system.convert.AcFunctionConverter;
import com.augurit.common.system.util.OrgUtils;
import com.augurit.common.system.web.org.form.AcFunctionForm;
import com.augurit.common.system.web.org.form.AcMenuForm;
import com.augurit.common.util.HqlUtils;

/**
 * 功能DAO类
 */
@Repository
public class AcFunctionDao extends BaseDao<AcFunction, Long> {

	@Autowired
	private AcMenuDao acMenuDao;

	/**
	 * 根据功能ID获取功能名称
	 * @param id 功能ID
	 * @return
	 */
	public String getFuncName(Long id) {
		if(id != null){
			AcFunction entity = this.get(id);
			if(entity != null)
				return entity.getFuncName();
		}
		return null;
	}
	
	/**
	 * 保存应用系统Form对象
	 * @param form 应用系统Form对象
	 */
	public void save(AcFunctionForm form){
		
		if(form != null){
			AcFunction entity = null;
			
			//准备VO对象
			boolean isNewEntity = false;
			if(form != null && form.getFuncId() != null){
				entity = this.get(form.getFuncId());
			}else{
				entity = new AcFunction();
				isNewEntity = true;
			}
			
			//检查功能调用地址格式
			OrgUtils.checkFuncUrlFormat(form);
			
			//判断是否改变功能访问地址
			if(!isNewEntity && OrgUtils.isFuncUrlDifference(form, entity)){
				acMenuDao.changeRelatedMenuUrl(entity, form.getFuncUrl());
			}
			
			//属性值转换
			AcFunctionConverter.convertToEntity(form, entity);
			
			//保存
			super.save(entity);
			
			//回填ID属性值
			form.setFuncId(entity.getFuncId());
		}
	}
	
	/**
	 * 根据模块ID找出直属该模块的所有功能点
	 * @param moduleId 模块ID
	 * @return
	 */
	public List<AcFunction> getFuncsByModuleId(Long moduleId){
		if(moduleId != null)
			return findBy("moduleId", moduleId);
		else
			return null;
	}
	
	/**
	 * 根据模块ID集合找出直属这些模块的所有功能点
	 * @param moduleIds 模块ID集合
	 * @return
	 */
	public List<AcFunction> getFuncsByModuleIds(Long[] moduleIds) {
		if(moduleIds != null && moduleIds.length > 0){
			String hql = "from AcFunction ps where " + HqlUtils.buildOrCondition("ps", "moduleId", moduleIds);
			return this.find(hql);
		}else
			return null;
	}
	
	/**
	 * 找出指定模块的所有功能点
	 * @param moduleId 模块的主键
	 * @return 指定模块的所有功能点的主键列表
	 */
	public List<Long> getFuncIdsByModuleId(Long moduleId){
		if(moduleId != null){
			String hql = "select ps.funcId from AcFunction ps where ps.moduleId=?";
		    List<Long> values = new ArrayList();
		    values.add(moduleId);
		    return this.find(hql, values);
		}else
			return null;
	}
	
	/**
	 * 为菜单Form对象列表加载关联功能名称
	 * @param list
	 */
	public void loadFuncName(List<AcMenuForm> list){
		if(list != null && list.size() > 0){
			for(AcMenuForm form : list)
				if(form != null && form.getFuncId() != null)
					form.setFuncName(this.getFuncName(form.getFuncId()));
		}
	}
}
